import pandas as pd
import json
import requests
import random
import re

from common.send_request import request_run_main


def get_value_by_path(data, path):
    """
    根据路径递归获取数据值
    :param data: 响应数据 (dict)
    :param path: 路径字符串 (例如 'data[0].token')
    :return: 对应值
    """
    keys = path.split(".")  # 按点分割路径
    for key in keys:
        if "[" in key and "]" in key:  # 如果路径中有数组索引
            key, index = key.split("[")[0], int(key.split("[")[1].replace("]", ""))
            data = data[key][index]
        else:
            data = data[key]
    return data


def replace_dynamic_variables(body):
    # 如果是字典，遍历字典中的每个项
    if isinstance(body, dict):
        for key, value in body.items():
            body[key] = replace_dynamic_variables(value)
    
    # 如果是列表，遍历列表中的每个元素
    elif isinstance(body, list):
        for i in range(len(body)):
            body[i] = replace_dynamic_variables(body[i])
    
    # 如果是字符串，进行替换
    elif isinstance(body, str):
        # 使用正则表达式查找所有占位符
        matches = re.findall(r'\{([^}]+)\}', body)  # 提取 { } 内的内容
        for match in matches:
            # 如果 match 是数字（如 "3124"），使用随机数替换
            if match.isdigit():
                body = body.replace(f'{{{match}}}', str(random.randint(1, 100)))  # 替换为随机数
            else:
                # 如果是其他字符串（如 {wangjiaxing}），使用指定的替换值
                body = body.replace(f'{{{match}}}', str(random.randint(1, 20)))
    return body

def process_dependencies_and_send_requests(test_data=None, excel_path=None):
    dependencies = test_data.get("依赖数据")

    if isinstance(dependencies, str):
        # 如果是字符串，解析为 Python 对象
        dependencies = json.loads(dependencies).get("依赖数据")
        
    if not dependencies:
        return {}

    extracted_data = {}

    # 读取 Excel 文件并跳过前两行
    df = pd.read_excel(excel_path, skiprows=2)

    # 去除列名前后多余的空格
    df.columns = df.columns.str.strip()

    for dep in dependencies:
        interface_name = dep.get("接口名称")
        dependency_fields = dep.copy()
        del dependency_fields["接口名称"]

        # 找到对应接口的数据行（只获取第一个匹配的接口）
        matching_row = df[df["接口名称"] == interface_name].iloc[:1]
        if matching_row.empty:
            raise ValueError(f"未找到接口 {interface_name} 的测试数据")

        # 提取接口请求的 URL、Headers 和 Body
        url = matching_row.iloc[0]["请求url"]
        headers = json.loads(matching_row.iloc[0]["请求头"])
        body = json.loads(matching_row.iloc[0]["请求体"])

        # 替换动态变量
        body = replace_dynamic_variables(body)

        print("最终处理后的body:", body)

        # 发送接口请求
        response =request_run_main(url=url, headers=headers, json=body)
        print("发送请求后的body:", body)

        if response.status_code != 200:
            raise ValueError(f"接口 {interface_name} 请求失败: {response.status_code}, {response.text}")

        # 提取响应数据
        response_data = response.json()

        # 根据依赖字段提取相关数据
        extracted_fields = {}
        for key, value_path in dependency_fields.items():
            try:
                extracted_fields[key] = get_value_by_path(response_data, value_path)
            except (KeyError, IndexError, TypeError):
                raise ValueError(f"在接口 {interface_name} 的响应中未找到依赖字段: {value_path}")

        # 保存结果
        extracted_data[interface_name] = extracted_fields

    return extracted_data


# # 测试代码
# excel = r'C:\ruanjian\python\新建文件夹\interface\interface.xlsx'
# test_data = {
#     "依赖数据": [
#         {"接口名称": "登录接口", "success": "sucess", "name": "data[0].name"},
#         {"接口名称": "订单接口", "olde": "data[0].olde"}
#     ]
# }

# print("返回数据是{}".format(process_dependencies_and_send_requests(test_data=test_data, excel_path=excel)))
